﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using db = XRM.Security.DataAccess.Models;

namespace XRM.Security.WebUI.Models.SkziKind
{
    public class SkziKindModel : BaseViewModel, IValidatableObject
    {
        public SkziKindModel()
        {
            SertificateFsbList = new List<SertificateFsbModel>();
            SertificateFstkList = new List<SertificateFstkModel>();
        }

        public SkziKindModel(db.SkziKind dbEntity)
        {
            SertificateFsbList = new List<SertificateFsbModel>();
            SertificateFstkList = new List<SertificateFstkModel>();

            if (dbEntity != null)
            {
                Id = dbEntity.SkziKindId;
                FullName = dbEntity.FullName;
                ShortName = dbEntity.ShortName;
                RegistrNumber = dbEntity.RegistrNumber;
                OperationDocName = dbEntity.OperationDocName;
                TechnikalDocName = dbEntity.TechnikalDocName;

                if (dbEntity.SertificateFsbs != null && dbEntity.SertificateFsbs.Any())
                {
                    foreach (db.SertificateFsb item in dbEntity.SertificateFsbs)
                    {
                        SertificateFsbList.Add(new SertificateFsbModel(item));
                    }
                }
                if (dbEntity.SertificateFstks != null && dbEntity.SertificateFstks.Any())
                {
                    foreach (db.SertificateFstk item in dbEntity.SertificateFstks)
                    {
                        SertificateFstkList.Add(new SertificateFstkModel(item));
                    }
                } 
            }
        }

        [AllowHtml]
        [Display(Name = "Полное наименование")]
        [Required(ErrorMessage = "Поле 'Полное наименование' обязательное")]
        [MaxLength(200, ErrorMessage = "Максимальная длина поля 'Полное наименование' 200 символов")]
        public string FullName { get; set; }

        [AllowHtml]
        [Display(Name = "Краткое наименование")]
        [Required(ErrorMessage = "Поле 'Краткое наименование' обязательное")]
        [MaxLength(100, ErrorMessage = "Максимальная длина поля 'Краткое наименование' 100 символов")]
        public string ShortName { get; set; }

        [AllowHtml]
        [Display(Name = "Регистрационный номер")]
        [Required(ErrorMessage = "Поле 'Регистрационный номер' обязательное")]
        [MaxLength(200, ErrorMessage = "Максимальная длина поля 'Регистрационный номер' 200 символов")]
        public string RegistrNumber { get; set; }

        [AllowHtml]
        [Display(Name = "Наименование эксплуатационной документации")]
        [MaxLength(200, ErrorMessage = "Максимальная длина поля 'Наименование эксплуатационной документации' 200 символов")]
        public string OperationDocName { get; set; }

        [AllowHtml]
        [Display(Name = "Наименование технической документации")]
        [MaxLength(200, ErrorMessage = "Максимальная длина поля 'Наименование технической документации' 200 символов")]
        public string TechnikalDocName { get; set; }

        [Display( Name = "Сертификаты ФСБ" )]
        public List<SertificateFsbModel> SertificateFsbList { get; set; }
        [Display( Name = "Сертификаты ФСТЭК" )]
        public List<SertificateFstkModel> SertificateFstkList { get; set; }

        public int? UserRegisterId { get; set; }
        public bool RedirectToUserPage { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            /*SertificateFsbList = SertificateFsbList.Where(s => (!string.IsNullOrWhiteSpace(s.Name)) || (s.Id.HasValue && s.Id > 0)).ToList();
            SertificateFstkList = SertificateFstkList.Where(s => (!string.IsNullOrWhiteSpace(s.Name)) || (s.Id.HasValue && s.Id > 0)).ToList();*/

            SertificateFsbList = SertificateFsbList.Where(s => (!string.IsNullOrWhiteSpace(s.Name))).ToList();
            SertificateFstkList = SertificateFstkList.Where(s => (!string.IsNullOrWhiteSpace(s.Name))).ToList();

            if (SertificateFsbList.Select(x => x.Name).Distinct().Count() != SertificateFsbList.Count())
            {
                yield return new ValidationResult("Сертификаты ФСБ не уникальны");
            }
            if (SertificateFsbList.Where(x => string.IsNullOrWhiteSpace(x.Name)).Any())
            {
                yield return new ValidationResult("Сертификат ФСБ не может быть пустым");
            }
            
            if (SertificateFstkList.Select(x => x.Name).Distinct().Count() != SertificateFstkList.Count())
            {
                yield return new ValidationResult("Сертификаты ФСТЭК не уникальны");
            }
            if (SertificateFstkList.Where(x => string.IsNullOrWhiteSpace(x.Name)).Any())
            {
                yield return new ValidationResult("Сертификат ФСТЭК не может быть пустым");
            }


            yield break;
        }
    }
}